package com.rose.redis._bloom_filter;

import cn.hutool.bloomfilter.BitMapBloomFilter;

/**
 * <p>
 * hu-tool库实现BloomFilter
 *
 * 布隆过滤器的原理是：当一个元素被加入集合时，通过K个散列函数将这个元素映射成一个位数组中的K个点，把它们置为1。
 * 检索时，我们只要看看这些点是不是都是1就（大约）知道集合中有没有它了：如果这些点有任何一个0，则被检元素一定不在；如果都是1，则被检元素很可能在。
 *
 * 1：如何解决是否误判？
 * key先去BloomFilter中检索，若多次hash为0，则key不存在，直接返回；若多次hash为1，则key可能存在，然后去Redis/DB中验证是否存在，
 * 若在Redis/DB中不存在，则证明该key是BloomFilter误判的key，则可以将该key加到别的集合中进行存储便于后续的判断（因为误判的数据肯定不多，因此该集合不大）
 *
 * </p>
 * @author: zhu.chen
 * @date: 2021/1/14
 * @version: v1.0.0
 */
public class HutoolBloomFilterTest {

    public static void main(String[] args) {
        BitMapBloomFilter filter = new BitMapBloomFilter(10);
        // 会将123通过多次hash计算，映射到BitMap中的点位，并将其置为1。
        filter.add("123");
        filter.add("abc");
        filter.add("ddd");

        // true ： 数据存在
        System.out.println(filter.contains("abc"));
        // false ：数据不存在
        System.out.println(filter.contains("bcd"));
    }

}
